﻿using System;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using System.IO;

namespace 大赛计时器
{
    public class 设定集
    {
        public enum 当前计时状态
        { 
        已停止,
        未设置,
        正在进行,
        正在进行且即将结束
        }

        public TimeSpan 剩余时间 { get; set; } = TimeSpan.FromSeconds(0);
        public DateTime 开始时间 { get; set; }
        public DateTime 结束时间 { get; set; }
        public TimeSpan 设定时间 { get; set; }
        public int 提醒时间 { get; set; } = 30;
        public 当前计时状态 状态 { get; set; } = 当前计时状态.未设置;
        public int 分针 { get; set; }
        public int 秒针 { get; set; }
        public bool 点显示 { get; set; }
        public Brushes 时钟颜色 { get; set; }
        public int 更新间隔 { get; set; } = 500;
        public string 提醒声音文件路径 { get; set; } = Directory.GetCurrentDirectory() + @"\时间将尽.mp3";
        public string 结束声音文件路径 { get; set; } = Directory.GetCurrentDirectory() + @"\时间到.mp3";
        public bool 已完成提醒 { get; set; } = false;
        public bool 程序运行 { get; set; } = true;
    }

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        设定集 设定 = new 设定集();
        public MainWindow()
        {
            InitializeComponent();
            object 引用时间 = 设定.剩余时间;
            设置器 设置器 = new 设置器(设定);
            设置器.关闭 = 关闭程序;
            设置器.开始计时线程 = 添加主线程;
            设置器.切换控件 = 切换移动控件;
            设置器.Show();
            
        }

        public void 设定倒计时(string 时间)
        {
            设定.设定时间 = TimeSpan.Parse(时间);
            设定.开始时间 = DateTime.Now;
            设定.结束时间 = 设定.开始时间.Add(设定.设定时间);
            设定.剩余时间 = 设定.设定时间;
        }

        public void 刷新倒计时()
        {
            设定.剩余时间 = 设定.结束时间.Subtract(DateTime.Now);

        }
        public void 添加主线程()
        {
            Thread 时间更新线程 = new Thread(更新时间界面);
            时间更新线程.Start();
        }

        public void 更新时间界面()
        {
            设定.状态 = 设定集.当前计时状态.正在进行;
            while (设定.状态 != 设定集.当前计时状态.已停止 && 设定.状态 != 设定集.当前计时状态.未设置)
            {
                if (设定.程序运行 == false) { break; }
                刷新倒计时();
                发出声音提醒();
                Dispatcher.BeginInvoke((Action)(() => {
                分针.Text = 设定.剩余时间.ToString("mm");
                秒针.Text =  设定.剩余时间.ToString("ss");
               }));
             Thread.Sleep(设定.更新间隔);
            }
        }

        public void 发出声音提醒()
        {

                if (设定.剩余时间.TotalSeconds <= 设定.提醒时间 && 设定.已完成提醒 == false)
                {
                    if (设定.提醒声音文件路径 != null && 设定.结束声音文件路径 != "")
                    {
                        Console.WriteLine("此处有内存泄漏，因为程序本身小，暂不解决");
                        MediaPlayer 播放器 = new MediaPlayer();
                        播放器.Open(new Uri(设定.提醒声音文件路径));
                        播放器.Play();

                    }
                设定.已完成提醒 = true;
                设定.状态 = 设定集.当前计时状态.正在进行且即将结束;
               }
                if (设定.剩余时间.TotalSeconds <= 0 )
                {
                    if (设定.结束声音文件路径 != null && 设定.结束声音文件路径 != "")
                    {
                        Console.WriteLine("此处有内存泄漏，因为程序本身小，暂不解决");
                        MediaPlayer 播放器 = new MediaPlayer();
                        播放器.Open(new Uri(设定.结束声音文件路径));
                        播放器.Play();
                    }
                    设定.状态 = 设定集.当前计时状态.已停止;
                }
            
        }

        public void 更换时钟颜色()
        { 
        
        }
        public void 切换移动控件()
        {
            if (放置块.Visibility == Visibility.Visible) { 放置块.Visibility = Visibility.Collapsed; return; }
            if (放置块.Visibility == Visibility.Collapsed) { 放置块.Visibility = Visibility.Visible; return; }

        }

        public void 关闭程序()
        {
            this.Close();
            设定.程序运行 = false;
            Application.Current.Shutdown();
        }
    }
}
